package com.analysis.utils;

import com.analysis.entity.User;
import com.analysis.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 密码迁移工具类
 * 用于将现有用户的明文密码转换为BCrypt加密密码
 */
@Component
public class PasswordMigrationUtil {
    
    @Autowired
    private UserMapper userMapper;
    
    /**
     * 迁移所有用户的密码为加密格式
     * 注意：此方法会直接修改数据库，请谨慎使用
     */
    public void migrateAllPasswords() {
        List<User> users = userMapper.selectAll();
        int migratedCount = 0;
        
        for (User user : users) {
            // 检查密码是否已经加密
            if (user.getPassword() != null && !PasswordUtils.isEncoded(user.getPassword())) {
                String originalPassword = user.getPassword();
                String encryptedPassword = PasswordUtils.encodePassword(originalPassword);
                
                // 更新密码
                user.setPassword(encryptedPassword);
                userMapper.update(user);
                
                System.out.println("用户 " + user.getNick() + " 的密码已加密");
                migratedCount++;
            }
        }
        
        System.out.println("密码迁移完成，共迁移 " + migratedCount + " 个用户");
    }
    
    /**
     * 迁移指定用户的密码
     * @param userId 用户ID
     */
    public void migrateUserPassword(Long userId) {
        User user = userMapper.selectById(userId);
        if (user != null && user.getPassword() != null && !PasswordUtils.isEncoded(user.getPassword())) {
            String originalPassword = user.getPassword();
            String encryptedPassword = PasswordUtils.encodePassword(originalPassword);
            
            user.setPassword(encryptedPassword);
            userMapper.update(user);
            
            System.out.println("用户 " + user.getNick() + " 的密码已加密");
        } else {
            System.out.println("用户不存在或密码已加密");
        }
    }
    
    /**
     * 生成指定密码的BCrypt加密字符串
     * 用于手动更新数据库
     * @param plainPassword 明文密码
     * @return 加密后的密码
     */
    public String generateEncryptedPassword(String plainPassword) {
        return PasswordUtils.encodePassword(plainPassword);
    }
}
